package pers.jl.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import pers.jl.entity.User;
import pers.jl.mapper.UserMapper;
import pers.jl.service.IUserService;

import javax.servlet.http.HttpSession;
import java.util.Map;

/**
 * <p>
 * 用户信息 服务实现类
 * </p>
 *
 * @author luge
 * @since 2023-04-22
 */
@Service

@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 用户登录
     * map里包含用户名和验证码
     * @param session
     * @param map
     * @return
     */
    @Override
    public boolean login(HttpSession session, Map<String, Object> map) {

        // 一、将电话号码和验证码以及redis中的验证码先获取出来
        String phone = (String) map.get("phone");
        String code = (String) map.get("code");
        // 从redis中获取验证码
        String rediscode = (String) redisTemplate.opsForValue().get(phone);
        log.info("存在redis中的验证码:"+rediscode);

        // 二、根据电话号码查询用户对象
        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
        userLambdaQueryWrapper.eq(User::getPhone,phone);
        User user = this.getOne(userLambdaQueryWrapper);
        // 三、判断用户是否存在
        if (StringUtils.isEmpty(user)) {
            // 1. 用户不存在，走注册逻辑，判断验证码是否正确。
            if (!code.equals(rediscode)){
            //	如果验证码不正确，直接注册失败。
                return false;
            }else {
            //	如果验证码正确，new一个用户对象，将用户电话号码等基础信息设置到对象里，然后将用户id设置到session中，返回用户对象，登录成功。
                User user1 = new User();
                user1.setPhone(phone);
                // 保存用户信息
                this.save(user1);
                session.setAttribute("userId",user1.getId());
                log.info("用户"+user1.getId()+"注册成功！");
                // 注册成功，清除redis中的验证码
                redisTemplate.delete(phone);
                return true;
            }
        }else {
            // 2. 用户存在，走登录逻辑，判断验证码是否正确.
            if (!code.equals(rediscode)){
            //	如果验证码不正确，登录失败。
                return false;
            }else {
            //	如果验证码正确，将用户存入session中然后返回用户对象，登录成功。
                session.setAttribute("userId",user.getId());
                log.info("用户"+user.getId()+"登录成功！");
                // 登录成功，清除redis中的验证码
                log.info("登录成功，清除redis中的验证码");
                redisTemplate.delete(phone);
                return true;
            }
        }
    }
}
